package com.heima.media.task;

import com.heima.media.entity.WmNews;
import com.heima.media.service.IAuditService;
import com.heima.media.service.IWmNewsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RBlockingDeque;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.redisson.client.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Async
@Slf4j
@Component
public class MediaTask {
@Autowired
private  RedissonClient redissonClient;
@Autowired
//@Lazy           //解决低版本springboot 循环依赖问题
private  IAuditService auditService;
@Autowired
private IWmNewsService wmNewsService;
    /**
     * 处理监听到的延迟发布文章消息
     */
    @Async("leadnewsExecutor")
    public void handlerMsg() {
        try {
            //声明监听阻塞队列
            RBlockingDeque<String> blockingDeque = redissonClient.getBlockingDeque("article-delay-queue");//生产消息队列名称和消费消息队列名称一致
            //拉取消息
            //从阻塞队列（即记录已到期时间的List结构）取出队首的元素，如果在指定时间内，队列一旦有数据立即返回队列中数据。否则直到时间超时还没有数据可取，返回null
            while (true){
                String wmNewId = blockingDeque.poll(30, TimeUnit.SECONDS);//30代表从阻塞队列，即记录已到期时间的List中取数据，如果在指定时间内，队列有数据则立即返回队列中的数据否则超时还没数据可取返回null
                if (wmNewId == null) {
                    log.info("超过指定时间30S没有拉取到数据，返回{}", wmNewId);
                } else {
                    log.info("监听到延迟消息：{}", wmNewId);
                    WmNews wmNews = wmNewsService.getById(wmNewId);
                    auditService.audit(wmNews);//修改状态审核通过待发布
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
